#include<iostream>
#include<unistd.h>
#include<fcntl.h>
#include<signal.h>
#include<cstring>
#include<cerrno>
bool SetNonBlock(int fd)
{
    int fl=fcntl(fd,F_GETFL);
    if(fl<0)
    {
        std::cerr<<"fcntl error"<<std::endl;
        return false;
    }
    fcntl(fd,F_SETFL,fl | O_NONBLOCK);
    return true;
}
int main()
{
    SetNonBlock(0);
    char buffer[1024];
    while(1)
    {
        ssize_t s=read(0,buffer,sizeof(buffer)-1);
        if(s<0)
        {
            //当read函数以非阻塞方式读取标准输入时，如果底层数据不就绪，那么read函数就会立即返回，
            //但当底层数据不就绪时，read函数是以出错的形式返回的，此时的错误码会被设置为EAGAIN或EWOULDBLOCK。
            //因此在以非阻塞方式读取数据时，如果调用read函数时得到的返回值是-1，此时还需要通过错误码进一步进行判断，
            //如果错误码的值是EAGAIN或EWOULDBLOCK，说明本次调用read函数出错是因为底层数据还没有就绪，
            //因此后续还应该继续调用read函数进行轮询检测数据是否就绪，当数据继续时再进行数据的读取。

            if(errno==EAGAIN || errno==EWOULDBLOCK){
                std::cout<<strerror(errno)<<std::endl;
                sleep(1);
                continue;
            }
            //调用read函数在读取到数据之前可能会被其他信号中断，此时read函数也会以出错的形式返回，
            //此时的错误码会被设置为EINTR，此时应该重新执行read函数进行数据的读取。
            else if(errno==EINTR)
            {
                std::cout<<strerror(errno)<<std::endl;
                sleep(1);
                continue;
            }
            else{
                std::cerr<<"read error"<<std::endl;
                break;
            }
        }
        buffer[s]='\0';
        std::cout<<"echo#:"<<buffer<<std::endl;
    }
    return 0;
}
